package com.heima.selection.config;

import cn.dev33.satoken.filter.SaServletFilter;
import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.router.SaRouter;

import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
 * sa-token 配置
 * @author YuanZiwen
 * @date 2025/06/22
 */
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {

    @Autowired
    private GatewayConfigure gatewayConfigure;

    @Bean
    public StpLogic getStpLogicJwt() {
        return new StpLogicJwtForSimple();
    }

    // 注册 Sa-Token 的过滤器
    @Bean
    public SaServletFilter getSaServletFilter() {
        return new SaServletFilter()
                // 拦截地址
                .addInclude("/**")
                // 开放地址
                .setExcludeList(gatewayConfigure.getExcludeList())
                // 鉴权方法：每次访问进入
                .setAuth(obj -> {
                    /*
                     *  登录校验 -- 拦截所有路由，并排除以下地址用于开放登录
                     *  {/sys/api/auth/doLogin,/sys/api/auth/v1/sfLogin}
                     *
                     */
                    System.out.println("进入 Sa-Token 鉴权：" + obj);
                    SaRouter.match("/**")
                            .notMatch("/sys/api/auth/doLogin", "/sys/api/auth/v1/sfLogin")
                            .check(r -> StpUtil.checkLogin());
                })
                // 异常处理方法：每次setAuth函数出现异常时进入
                .setError(e -> SaResult.error(e.getMessage()).setCode(401));
    }


}